package top.healthylife.gateway.core.service;

import lombok.SneakyThrows;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import top.healthylife.gateway.core.util.ParameterCheckUtils;

/**
 * 标准的调用父级api ，不作任何处理，只做规定使用
 *
 * @author maoxiaomeng
 */
public interface ParentFace<ApiReqDto, ApiResultDto> {
    Logger log = LoggerFactory.getLogger(ParentFace.class);


    /**
     * 检查参数是否完整，如果不完成，直接异常
     *
     * @param data 服务需要的对象
     * @author maoxiaomeng
     * @date: 2020/3/20 13:22
     * @return: java.lang.Object
     */
    @SneakyThrows
    default ApiResultDto checkAndExecute(ApiReqDto data) {
        //分组处理
        ParameterCheckUtils.FieldsCheck fields = ParameterCheckUtils.getDeclaredFields(data.getClass());
        //单独校验
        ParameterCheckUtils.singleCheckException(data, fields.getList());
        //分组校验
        ParameterCheckUtils.groupCheckException(data, fields.getGroupList());
//        //必传项校验
//        ParameterCheckUtils.checkRequiredParam(data.getClass(), data);
        return execute(data);
    }

    /**
     * 接口调用链中会直接调用此方法，通过泛型接口进行直接调用
     *
     * @param t 字段说明
     * @throws Exception 接口中的调用异常问题
     * @author maoxiaomeng
     * @return: java.lang.Object 查询的真实结果，如果是失败，则直接返回异常即可,此返回结果不要结构层，只要外面一层数据
     */
    ApiResultDto execute(ApiReqDto t) throws Exception;

}
